#ifndef __GAF_DEFINE_H__
#define __GAF_DEFINE_H__

#include "GAF_Setting.h"
#include "GAF_SysIncDef.h"
#include "GAF_Type.h"
#include "GAF_Utility.h"

#pragma WARNING(disable:4100)		// 忽略未引用形参警告

// ****** 关键字 ******
/// 接口关键字
#define _INTERFACE
/// 抽象类关键字
#define _ABSTRACT
/// 临时声明关键字
#define _TEMPORARY

/// 输入参数关键字
#define _IN
/// 输出参数关键字
#define _OUT
/// 输入输出参数关键字
#define _IN_OUT

/// 事件处理方法关键字
#define _EVTFUN
/// 命令处理方法关键字
#define _CMDFUN

// ****** 常数状态 ******
/// 空值
#ifndef NULL
#define NULL				0
#endif

/// 不限画面更新次数
#define GAF_FPS_NONE			0
/// 默认画面更新次数
#define GAF_FPS_DEFAULT			50

// ****** 操作 ******
/// 类型判断操作
#define GAF_KINDOF(_TYPE1, _TYPE2)	(typeid(_TYPE1) == typeid(_TYPE2))

// ****** 父类 ******
/// 父类指针
#define SUPER(_KIND)			((_KIND*)this)
/// 父类对象访问
#define BASE(_KIND)			_KIND::


// ****** 属性定义 ******
/// 属性成员变量
#define ATTRIB(_Name)			m_atb##_Name
#define ATTRIB_FUNBACK			_a
#define ATTRIB_GETFUN(_TYPE, _Name, _Back) \
	virtual inline _TYPE& Get##_Name##_Back()
#define ATTRIB_SETFUN(_TYPE, _Name, _val, _Back) \
	virtual inline void Set##_Name##_Back(_TYPE _val)

/// 定义只读属性
#define DIM_ATTRIB_R(_TYPE, _Name) \
	protected: \
		_TYPE ATTRIB(_Name); \
	public: \
		ATTRIB_GETFUN(_TYPE, _Name, _a) {return ATTRIB(_Name);}
/// 定义属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB(_TYPE, _Name) \
		DIM_ATTRIB_R(_TYPE, _Name) \
		ATTRIB_SETFUN(_TYPE, _Name, val, _a) {ATTRIB(_Name) = val;}

/// 定义只读数组属性
#define DIM_ATTRIB_ARRAY_R(_TYPE, _Name, _nSize) \
	protected: \
		_TYPE ATTRIB(_Name)[_nSize]; \
	public: \
		ATTRIB_GETFUN(_TYPE*, _Name, _a) {return ATTRIB(_Name);}
// 		virtual inline _TYPE*& Get##_Name() {return ATTRIB(_Name);}
/// 定义数组属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB_ARRAY(_TYPE, _Name, _nSize) \
		DIM_ATTRIB_ARRAY_R(_TYPE, _Name, _nSize) \
		ATTRIB_SETFUN(_TYPE*, _Name, pval, _a) \
		{ \
			for(int _i = 0; _i < _nSize; _i++) \
				ATTRIB(_Name)[_i] = pval[_i]; \
		}

/// 定义只读关联属性
#define DIM_ATTRIB_ASSOCIATED_R(_TYPE, _Name, _Arg) \
	public: \
		ATTRIB_GETFUN(_TYPE, _Name, _a) {return _Arg;}
//		virtual inline _TYPE& Get##_Name() {return _Arg;}
/// 定义数组属性，需重载属性类型的等号操作符。
#define DIM_ATTRIB_ASSOCIATED(_TYPE, _Name, _Arg) \
		ATTRIB_SETFUN(_TYPE, _Name, val, _a) {_Arg = val;}


// ****** 调试状态 ******
#include "GAF_Debug.h"


// ****** 内存机制 ******
#include "GAF_MemManage.h"


// ****** 颜色格式 ******
/// RGBA格式颜色
#define GAF_RGBA_32(_r, _g, _b, _a)	(((BYTE)(_r)) << 24 | ((BYTE)(_g)) << 16 | ((BYTE)(_b)) << 8 | ((BYTE)(_a)) << 0)
/// ABGR格式颜色
#define GAF_ABGR_32(_r, _g, _b, _a)	(((BYTE)(_a)) << 24 | ((BYTE)(_b)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_r)) << 0)
/// RGB格式颜色
// #define GAF_RGB_24(_r, _g, _b)		(((BYTE)(_r)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_b)) << 0)
/// BGR格式颜色
// #define GAF_BGR_24(_r, _g, _b)		(((BYTE)(_b)) << 16 | ((BYTE)(_g)) << 8 | ((BYTE)(_r)) << 0)

// ****** 快速创建 ******
namespace GAF
{
	Point				CreatePoint(int x, int y);
	Size				CreateSize(UINT width, UINT height);
	Rect				CreateRect(int x, int y, UINT width, UINT height);
	Colour				CreateColour(BYTE red, BYTE green, BYTE blue, BYTE Alpha = 255);
}
#define GAF_CREATE_POINT		GAF::CreatePoint
#define GAF_CREATE_SIZE			GAF::CreateSize
#define GAF_CREATE_RECT			GAF::CreateRect
#define GAF_CREATE_COLOUR		GAF::CreateColour

// ****** 常用类型参数格式 ******
/// 点参数格式
#define GAF_ARG_POINT(_point)		_point.nX, _point.nY
/// 尺寸参数格式
#define GAF_ARG_SIZE(_size)		_size.nWidth, _size.nHeight
/// 矩形参数格式
#define GAF_ARG_RECT(_rect)		_rect.nX, _rect.nY, _rect.nWidth, _rect.nHeight
/// 颜色参数格式
#define GAF_ARG_COLOUR_RGBA(_colour)	_colour.bRed, _colour.bGreen, _colour.bBlue, _colour.bAlpha
#define GAF_ARF_COLOUR_RGB(_colour)	_colour.bRed, _colour.bGreen, _colour.bBlue

// ****** 全局常量定义 ******
namespace GAF
{
	/// 全局原点常量
	const Point	g_atOrigin	= {0, 0};
	/// 全局零尺寸常量
	const Size	g_sZero		= {0, 0};
	/// 全局空矩形常量
	const Rect	g_rNull		= {0, 0, 0, 0};

	/// 全局透明色常量
	const Colour	g_cTransparent	= {0, 0, 0, 0};
	/// 全局白色常量
	const Colour	g_cWhite	= {255, 255, 255, 255};
	/// 全局黑色常量
	const Colour	g_cBlack	= {  0,   0,   0, 255};
	/// 全局红色常量
	const Colour	g_cRed		= {255,   0,   0, 255};
	/// 全局绿色常量
	const Colour	g_cGreen	= {  0, 255,   0, 255};
	/// 全局蓝色常量
	const Colour	g_cBlue		= {  0,   0, 255, 255};
}

/// 原点
#define GAF_POINT_ORIGIN		GAF::g_atOrigin
/// 零尺寸
#define GAF_SIZE_ZERO			GAF::g_sZero
/// 空矩形
#define GAF_RECT_NULL			GAF::g_rNull

/// 透明色
#define GAF_COLOUR_TRANSPARENT		GAF::g_cTransparent
/// 白色
#define GAF_COLOUR_WHITE		GAF::g_cWhite
/// 黑色
#define GAF_COLOUR_BLACK		GAF::g_cBlack
/// 红色
#define GAF_COLOUR_RED			GAF::g_cRed
/// 绿色
#define GAF_COLOUR_GREEN		GAF::g_cGreen
/// 蓝色
#define GAF_COLOUR_BLUE			GAF::g_cBlue

#endif
